#include <stdio.h>
#include <stdlib.h>


struct Tdati{
int msgNumber;
int sensorID;
char *sensorValue;
char *destinationIP;
int anno;
int mese;
int giorno;
int ora;
int minuti;
int secondi;
int deadline;
char* type;
struct Tdati *next;
};

typedef struct Tdati dati_t;


struct Tcoda{
	struct Tdati *primo,*ultimo;
	int num;
};

typedef struct Tcoda coda_t;



void queue_initialization(coda_t *c);
int insert_in_head(coda_t *c,dati_t elemento);
int insert_order_by_deadline(coda_t *c,dati_t elemento);
int remove_from_tail(coda_t *c,dati_t *elemento);
void stampa_coda(coda_t *c);

// -----------------------------------------------------------------------------------------------------------------------------------------------------

void queue_initialization(coda_t *c){

	c->primo=NULL;
	c->ultimo=NULL;
	c->num=0;
}

// -----------------------------------------------------------------------------------------------------------------------------------------------------

void stampa_coda(coda_t *c){
	dati_t *aux;
	aux=malloc(sizeof(dati_t));
	if(c->primo!=NULL){
		aux=c->primo;
		while(aux!=NULL){
			printf("\nId pacchetto: %d\t",aux->msgNumber);
			printf("Sensor id: %d\t",aux->sensorID);
			printf("Sensor value: %s\t",aux->sensorValue);
			printf("Ip client: %s\t",aux->destinationIP);
			printf("Timestamp: [%d,%d,%d,%d,%d,%d]\t",aux->anno,aux->mese,aux->giorno,aux->ora,aux->minuti,aux->secondi);
			printf("Deadline: %d\t",aux->deadline);
			printf("Type of msg: %s\n",aux->type);
			aux=aux->next;
		}
	}
}

// -----------------------------------------------------------------------------------------------------------------------------------------------------


int insert_in_head(coda_t *c,dati_t elemento){
	dati_t *aux;
	aux=malloc(sizeof(dati_t));
	if(aux)
		{
			*aux=elemento;
			aux->next=NULL;

			if(c->primo==NULL)
				c->primo=aux;
			else
				c->ultimo->next=aux;
			c->ultimo=aux;
			c->num++;
			printf("elemento inserito!!\n\n\n");
			return 0;
		}
		printf("elemento inserito2nhnjmjumjumu!!\n");
		return 1;
}


// -----------------------------------------------------------------------------------------------------------------------------------------------------



int insert_order_by_deadline(coda_t *c,dati_t elemento){
	dati_t *l1, *l2;
	l1=malloc(sizeof(dati_t));
	l2=malloc(sizeof(dati_t));

	/* Inserimento in testa*/
	if(c->primo==NULL || elemento.deadline < c->primo->deadline){
		insert_in_head(c,elemento);
		printf("inserisco in I posizione");
		return 0;

	}

	/* Inserimento in posizione successiva alla prima*/
	l1=c->primo;
	l2=l1->next;
	while(l2){
		if(elemento.deadline<l2->deadline){
			printf("inserisco in posizione successiva");
			break;}
		else{	
			l1=l1->next;
			l2=l2->next;
			printf("passo alla posizione successiva");
		}
	}
	*l1->next=elemento;
	elemento.next=l2;
	return 0;
}



// -----------------------------------------------------------------------------------------------------------------------------------------------------


int remove_from_tail(coda_t *c,dati_t *elemento){

    if(c->primo==NULL)
	{
	printf("Coda vuota");
	return 1;
    }

	*elemento=*(c->primo);
	c->primo=elemento->next;

	if(c->primo==NULL)
		c->ultimo=NULL;
	c->num--;
	printf("elemento rimosso, num elem attuali:%d\n\n\n",c->num);
	return 0;
}

